From 7c876846292b6ee3ebf9c4b8946674dc293418b3 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 1 Oct 2012 11:30:03 +0200 Subject: [PATCH] broadway: Centralize cmd parsing This clean up things, as well as prepares for new message formats such as binary websockets. --- gdk/broadway/broadway.js | 154 +++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 79 deletions(-) diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js index 90b9d53cff..86b605a50c 100644 --- a/gdk/broadway/broadway.js +++ b/gdk/broadway/broadway.js @@ -725,76 +725,56 @@ function cmdUngrabPointer() doUngrab(); } -function handleCommands(cmdObj) +function handleCommands(cmd) { - var cmd = cmdObj.data; - var i = cmdObj.pos; - - while (i < cmd.length) { + while (cmd.pos < cmd.length) { var id, x, y, w, h, q; - var command = cmd[i++]; - lastSerial = base64_32(cmd, i); - i = i + 6; + var command = cmd.get_char(); + lastSerial = cmd.get_32(); switch (command) { case 's': // create new surface - id = base64_16(cmd, i); - i = i + 3; - x = base64_16s(cmd, i); - i = i + 3; - y = base64_16s(cmd, i); - i = i + 3; - w = base64_16(cmd, i); - i = i + 3; - h = base64_16(cmd, i); - i = i + 3; - var isTemp = cmd[i] == '1'; - i = i + 1; + id = cmd.get_16(); + x = cmd.get_16s(); + y = cmd.get_16s(); + w = cmd.get_16(); + h = cmd.get_16(); + var isTemp = cmd.get_bool(); cmdCreateSurface(id, x, y, w, h, isTemp); break; case 'S': // Show a surface - id = base64_16(cmd, i); - i = i + 3; + id = cmd.get_16(); cmdShowSurface(id); break; case 'H': // Hide a surface - id = base64_16(cmd, i); - i = i + 3; + id = cmd.get_16(); cmdHideSurface(id); break; case 'p': // Set transient parent - id = base64_16(cmd, i); - i = i + 3; - var parentId = base64_16(cmd, i); - i = i + 3; + id = cmd.get_16(); + var parentId = cmd.get_16(); cmdSetTransientFor(id, parentId); break; case 'd': // Delete surface - id = base64_16(cmd, i); - i = i + 3; + id = cmd.get_16(); cmdDeleteSurface(id); break; case 'm': // Move a surface - id = base64_16(cmd, i); - i = i + 3; - var ops = cmd.charCodeAt(i++) - 48; + id = cmd.get_16(); + var ops = cmd.get_flags(); var has_pos = ops & 1; if (has_pos) { - x = base64_16s(cmd, i); - i = i + 3; - y = base64_16s(cmd, i); - i = i + 3; + x = cmd.get_16s(); + y = cmd.get_16s(); } var has_size = ops & 2; if (has_size) { - w = base64_16(cmd, i); - i = i + 3; - h = base64_16(cmd, i); - i = i + 3; + w = cmd.get_16(); + h = cmd.get_16(); } cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h); break; @@ -802,21 +782,14 @@ function handleCommands(cmdObj) case 'i': // Put image data surface q = new Object(); q.op = 'i'; - q.id = base64_16(cmd, i); - i = i + 3; - q.x = base64_16(cmd, i); - i = i + 3; - q.y = base64_16(cmd, i); - i = i + 3; - var size = base64_32(cmd, i); - i = i + 6; - var url = cmd.slice(i, i + size); - i = i + size; + q.id = cmd.get_16(); + q.x = cmd.get_16(); + q.y = cmd.get_16(); + var url = cmd.get_image_url (); q.img = new Image(); q.img.src = url; surfaces[q.id].drawQueue.push(q); if (!q.img.complete) { - cmdObj.pos = i; q.img.onload = function() { handleOutstanding(); }; return false; } @@ -825,44 +798,33 @@ function handleCommands(cmdObj) case 'b': // Copy rects q = new Object(); q.op = 'b'; - q.id = base64_16(cmd, i); - i = i + 3; - - var nrects = base64_16(cmd, i); - i = i + 3; + q.id = cmd.get_16(); + var nrects = cmd.get_16(); q.rects = []; for (var r = 0; r < nrects; r++) { var rect = new Object(); - rect.x = base64_16(cmd, i); - i = i + 3; - rect.y = base64_16(cmd, i); - i = i + 3; - rect.w = base64_16(cmd, i); - i = i + 3; - rect.h = base64_16(cmd, i); - i = i + 3; + rect.x = cmd.get_16(); + rect.y = cmd.get_16(); + rect.w = cmd.get_16(); + rect.h = cmd.get_16(); q.rects.push (rect); } - q.dx = base64_16s(cmd, i); - i = i + 3; - q.dy = base64_16s(cmd, i); - i = i + 3; + q.dx = cmd.get_16s(); + q.dy = cmd.get_16s(); surfaces[q.id].drawQueue.push(q); break; case 'f': // Flush surface - id = base64_16(cmd, i); - i = i + 3; + id = cmd.get_16(); cmdFlushSurface(id); break; case 'g': // Grab - id = base64_16(cmd, i); - i = i + 3; - var ownerEvents = cmd[i++] == '1'; + id = cmd.get_16(); + var ownerEvents = cmd.get_bool (); cmdGrabPointer(id, ownerEvents); break; @@ -888,13 +850,47 @@ function handleOutstanding() } } +function TextCommands(message) { + this.data = message; + this.length = message.length; + this.pos = 0; +} + +TextCommands.prototype.get_char = function() { + return this.data[this.pos++]; +}; +TextCommands.prototype.get_bool = function() { + return this.get_char() == '1'; +}; +TextCommands.prototype.get_flags = function() { + return this.get_char() - 48; +} +TextCommands.prototype.get_16 = function() { + var n = base64_16(this.data, this.pos); + this.pos = this.pos + 3; + return n; +}; +TextCommands.prototype.get_16s = function() { + var n = base64_16s(this.data, this.pos); + this.pos = this.pos + 3; + return n; +}; +TextCommands.prototype.get_32 = function() { + var n = base64_32(this.data, this.pos); + this.pos = this.pos + 6; + return n; +}; +TextCommands.prototype.get_image_url = function() { + var size = this.get_32(); + var url = this.data.slice(this.pos, this.pos + size); + this.pos = this.pos + size; + return url; +}; + function handleMessage(message) { - var cmdObj = {}; - cmdObj.data = message; - cmdObj.pos = 0; - - outstandingCommands.push(cmdObj); + var cmd = new TextCommands(message); + outstandingCommands.push(cmd); if (outstandingCommands.length == 1) { handleOutstanding(); } -- 2.30.2